<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0">
</head>

<body>
	<!-- IMPORT JS -->
	<script>
		// 解释：
		// 函数声明： function xxx(){}; 声明且赋值  在堆内存中
		// 表达式字面量写法： var xxx = function(){}; 声明不赋值
		// Go: {}; { FOO:undefined,getName:undefined}; {FOO:function, getName: undefined}
		// Ao:Foo

		// 1
		function Foo() {
			getName = function () {
				console.log(1);
			};
			return this;
		}
		// 2
		Foo.getName = function () {
			console.log(2);
		};
		// 3
		Foo.prototype.getName = function () {
			console.log(3);
		};
		// 4
		var getName = function () {
			console.log(4);
		};
		// 5
		function getName() {
			console.log(5);
		}
		

		Foo.getName();    			// 2  直接调用 2

		getName();    				// 4  运行全局的getName(),在GO中 getName先为5，后在执行时被赋值为4

		Foo().getName();			// 1  先运行FOO()， 修改了全局的getName为 1 ，返回this即为window，调用全局的getName

		getName(); 					// 1  此时经过FOO()调用GO中的getName: 1

		new Foo.getName();   		// 2  设计运算符优先级问题，，new中带参数(19)优先级比无参数高(18)，同级从左往右,此处先运行Foo.getName()再new

		new Foo().getName();		// 3  此处先new Foo() 再调用.getName()，创建实例，访问原型上的prototype.getName

		new new Foo().getName(); 	// 3  先new Foo()，再跑prototype.getName，再new这个方法

	</script>
</body>

</html>